package com.ning.reggie.common;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

/**
 * 通用响应类 R，用于封装 API 的响应结果。
 * T 是泛型参数，表示响应数据的类型。
 */
@Data
@ApiModel("返回结果")
public class R<T> implements Serializable {

    /**
     * 编码：1 表示成功，0 和其它数字为失败。
     */
    @ApiModelProperty("编码")
    private Integer code;

    /**
     * 错误信息，当操作失败时返回具体的错误描述。
     */
    @ApiModelProperty("错误信息")
    private String msg;

    /**
     * 响应数据，具体的数据内容，类型由泛型参数 T 决定。
     */
    @ApiModelProperty("数据")
    private T data;

    /**
     * 动态数据的存储 Map，可用于存储一些额外的、动态的键值对数据。
     */
    @ApiModelProperty("动态数据")
    private Map map = new HashMap();

    /**
     * 静态方法，用于创建成功响应的实例。
     *
     * @param object 成功时返回的数据对象。
     * @param <T>    响应数据的类型。
     * @return 包含成功信息和数据的 R 实例。
     */
    public static <T> R<T> success(T object) {
        R<T> r = new R<T>();
        r.data = object;
        r.code = 1;
        return r;
    }

    /**
     * 静态方法，用于创建失败响应的实例。
     *
     * @param msg 错误信息描述。
     * @return 包含失败信息的 R 实例。
     */
    public static <T> R<T> error(String msg) {
        R r = new R();
        r.msg = msg;
        r.code = 0;
        return r;
    }

    /**
     * 向动态数据 Map 中添加键值对的方法。
     *
     * @param key   键。
     * @param value 值。
     * @return 当前 R 实例，方便链式调用。
     */
    public R<T> add(String key, Object value) {
        this.map.put(key, value);
        return this;
    }
}
